このページは私用WordPressの覚え書き兼、テストページです。
「SNSボタン」は、テスト検証用に仮設置しているだけなので、押しても反応しません。

018_2 カテゴリーの条件分岐がうまくいかない

(備忘録)


今、このblogでは、右側のサイドバー(sidebar.php)に、カテゴリーが「wordpress」の記事一覧を「目次」として表示させています。

この部分を、カテゴリーが「PHP」の時は「PHPの記事一覧」に切り替えるよう、条件分岐で変化させたいと思ったのですが、うまく動かず、数時間悩みました。


切り替えるための条件分岐

どこで条件分岐させるかは、いくつか方法があるかと思うのですが

現在 sidebar.php 内に、
<!--特定のカテゴリー(カテゴリー名=wordpress)の記事タイトル一覧をすべて表示する--> のコードを入れていて、
その箇所を、カテゴリーが「wordpress」なら○○の処理、カテゴリーが「PHP」の時は△△△の処理をする、という条件分岐のコードに修正するのが一般的かもしれません。


しかし今回は、sidebar.php をコピー流用して、sidebar-2.php というのを作り、
投稿記事のカテゴリーが「wordpress」なら sidebar.phpを、
カテゴリーが「PHP」の時はsidebar-2.php を表示する
、という方法をとってみることにしました。


それで、index.php の

<!-- サイドバー -->
<?php get_sidebar(); ?>
という箇所を条件分岐に書き換えたんですが、うまくいかない・・・


何故効かないのか・・・ しばらく悩みまくった後、・・・Σ(゚д゚;)ハッ と気がつきました。


条件分岐はどのファイルに入れるのか?

効かなかった理由は、条件分岐を index.php に入れていた為でした。
index.php ではなく single.phparchive.php に入れなければいけなかったのです。

記事をクリックで表示されるのは single.php、カテゴリー(またはメニュー)をクリックで表示されるのは archive.php
この条件分岐は index.php上ではそもそも入れても意味がなかった・・・onz

index.php は、一般的には最近の投稿が最新順に数件並び、カテゴリーも混在、というテンプレートなので、この条件分岐を入れる意味はなく、実際、条件分岐を index.php に入れても効きません
※ただし、オリジナルテーマに single.php と archive.php を作っていなかった場合は、index.php が代用されるので、記述する必要がでてきます。
(index.php の中身が長く複雑になってしまうので、シンプルに single.php と archive.php を作ってしまった方が楽かなと思いますが。)


single.php に入れる条件分岐

内容=カテゴリーが「php=ID 142」なら sidebar-2.php を出力、それ以外なら sidebar.php を出力する。

※archive.php とほぼ一緒ですが、single.php は、in_category()としています。

<!-- サイドバー -->
	<?php wp_reset_query(); if(in_category('142')):	//もしカテゴリーがID 142の「PHP」だったら ?>
		<?php get_sidebar('2'); ?>
	<?php else:	//それ以外は ?>
		<?php get_sidebar(); ?>
	<?php endif; ?>

in_category()」と「is_category()」の違い 参考URL→ 図解WordPress「この際はっきりさせておきたい in_category() と is_category() の違い」


archive.php に入れる条件分岐

内容=同じく、カテゴリーが「php=ID 142」なら sidebar-2.php を出力、それ以外なら sidebar.php を出力する。

※archive.php では、is_category()としています。

<!-- サイドバー -->
	<?php wp_reset_query(); if(is_category('142')):	//もしカテゴリーがID 142の「PHP」だったら ?>
		<?php get_sidebar('2'); ?>
	<?php else:	//それ以外は ?>
		<?php get_sidebar(); ?>
	<?php endif; ?>


sidebar.php には以下をいれています

(sidebar-2.php との違いは、「目次タイトル」=2行目と「カテゴリーID」=6行目のみ)

<!--特定のカテゴリー(wordpressのみ)の記事タイトル一覧をすべて表示する-->
<li><h3>wordpress関連の記事 - 目次</h3>
<?php
    $myQuery = new WP_Query(); // WP_Queryオブジェクト生成
    $param = array( //パラメータ。
		'cat' => '26', // カテゴリーID26の「wordpress」のみを表示。
        'posts_per_page' => '-1', //(整数)表示する記事数。-1 ならすべての投稿を取得。
        'post_status' => 'publish', //取得するステータスを指定:publish=公開済みのものだけ
        'orderby' => 'date', //並び替え引数。日付で並べる。
        'order' => 'asc' //昇順。古い記事が上。
    );
    $myQuery->query($param);  // クエリにパラメータを渡す
?>
<ul>
<?php if($myQuery->have_posts()): while($myQuery->have_posts()) : $myQuery->the_post(); ?>
        <li><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>の詳細へ">■<?php the_title(); ?></a></li>
<?php endwhile; endif; ?>
<?php wp_reset_query(); ?>
</ul>
</li>


sidebar-2.php には以下をいれています

(sidebar.php との違いは、「目次タイトル」=2行目と「カテゴリーID」=6行目のみ)

<!--特定のカテゴリー(PHP)の記事タイトル一覧をすべて表示する-->
<li><h3>PHP関連の記事 - 目次</h3>
<?php
    $myQuery = new WP_Query(); // WP_Queryオブジェクト生成
    $param = array( //パラメータ。
		'cat' => '142', // カテゴリーID 142の「PHP」のみを表示。
        'posts_per_page' => '-1', //(整数)表示する記事数。 -1 ならすべての投稿を取得。
        'post_status' => 'publish', //取得するステータスを指定:publish=公開済みのものだけ
        'orderby' => 'date', //並び替え引数。日付で並べる。
        'order' => 'asc' //昇順。古い記事が上。
    );
    $myQuery->query($param);  // クエリにパラメータを渡す
?>
<ul>
<?php if($myQuery->have_posts()): while($myQuery->have_posts()) : $myQuery->the_post(); ?>
        <li><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>の詳細へ">■<?php the_title(); ?></a></li>
<?php endwhile; endif; ?>
<?php wp_reset_query(); ?>
</ul>
</li>


カテゴリーIDの番号は、カテゴリーを作り直したり、blogを新しく作り直したりすると変わります。 その都度ID番号を直すのを忘れずに。